<template>
  <div class="CPT_DYBG" :style="bg + 'height:' + height">
    <div class="body">
      <!-- 头部留白区域 -->
      <slot></slot>
    </div>
    <div class="background">
      <div
        class="circle"
        :class="'move' + i"
        v-for="(it, i) in circle"
        :style="{
          width: it.size + unit,
          height: it.size + unit,
          top: it.position[0] + unit,
          left: it.position[1] + unit,
          backgroundColor: colorful ? it.color : circleColor,
          filter: blur > 0 ? 'blur(' + blur + unit + ')' : null,
          mixBlendMode: circleMode,
        }"
        :key="i"
      ></div>
    </div>
  </div>
</template>
<script>
export default {
  name: "CPT_DYBG",
  props: {
    bg: {
      type: String,
      default: "background-image:linear-gradient(to right, #dcfffd, #edffff);",
    },
    //高度继承父级100%高度，也可写固定px/rpx
    height: {
      type: String,
      default: "100%",
    },
    //小圆模糊度
    blur: {
      type: Number,
      default: 0,
    },
    //小圆数量
    number: {
      type: Number,
      default: 10,
    },
    //小圆颜色，为数组时，会随机分配给小圆，自行测试
    circleColor: {
      type: Array,
      default: () => ["rgba(85, 170, 255, 0.1)","rgba(0, 255, 255, 0.1)"],
    },
    //小圆的颜色混合模式，写css3 mixBlendMode参数
    circleMode: {
      type: String,
      default: "color-dodge",
    },
    //小圆参数，单位模式rpx，可在data里更改unit
    circleOptions: {
      type: Object,
      default: () => ({
        maxSize: 400, //最大直径
        maxX: 400, //最大横移距离
        maxY: 1000, //最大竖移距离
      }),
    },
  },
  computed: {
    colorful: function () {
      let color = this.circleColor;
      if (Array.isArray(color)) {
        return true;
      }
    },
  },
  data() {
    return {
      unit: "rpx",
      speedMode: ["ease-in", "ease-out", "ease-in-out", "linear"], //移动模式
      circle: [],
    };
  },
  created() {
    this.creatCircle();
  },
  methods: {
    creatCircle() {
      let n = this.number,
        { maxSize, maxX, maxY } = this.circleOptions,
        circleColor = this.circleColor,
        colorful = this.colorful,
        circle = [];
      for (let i = 0; i < n; i++) {
        circle.push({
          size: this.getRandomInt(maxSize),
          position: [this.getRandomInt(maxX), this.getRandomInt(maxY)],
          color: colorful ? this.getRandomColor() : null,
        });
      }
      this.circle = circle;
      setTimeout(() => {
        //刷新该组件时，快速还原，无刷新则可删除
        uni.stopPullDownRefresh();
      }, 500);
    },
    //一个v值，一个最小值，生成不小于最小值的随机值
    getRandomInt(v, min) {
      min = min ? min : 0;
      return parseInt(Math.random() * v + min);
    },
    getRandomColor() {
      let color = this.circleColor,
        len = color.length,
        r = color[parseInt(Math.random() * len)];

      return r;
    },
  },
};
</script>
<style lang="scss" scoped>
@import "./ani.scss";
.CPT_DYBG {
  overflow: hidden;
  position: relative;
  .body {
    height: 100%;
    width: 100%;
    overflow: hidden;
    position: relative;
    z-index: 1;
  }
  .background {
    position: absolute;
    z-index: 0;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    .circle {
      position: absolute;
      border-radius: 50%;
    }
  }
}
</style>